#include <stdio.h>
#include <string.h>
#include <ncurses.h> 
#include <unistd.h> 
 
#define PROGRESS_BAR_WIDTH 30 
#define BORDER_PADDING 2 
#define WINDOW_WIDTH (PROGRESS_BAR_WIDTH + 2 * BORDER_PADDING + 2) // 加边框的宽度  
#define WINDOW_HEIGHT 5 
#define PROGRESS_INCREMENT 3 
#define DELAY 300000 // 微秒（300毫秒）  
 
int main() { 
	initscr(); 
	start_color(); 
	init_pair(1, COLOR_GREEN, COLOR_BLACK); // 已完成部分：绿⾊前景，⿊⾊背景  
	init_pair(2, COLOR_RED, COLOR_BLACK); // 剩余部分（虽然⽤红⾊可能不太合适，但为演⽰⽬的）：红⾊背景  
	cbreak(); 
	noecho(); 
	curs_set(FALSE); 
	
	int max_y, max_x; 
	getmaxyx(stdscr, max_y, max_x); 
	int start_y = (max_y - WINDOW_HEIGHT) / 2; 
	int start_x = (max_x - WINDOW_WIDTH) / 2; 
	
	WINDOW *win = newwin(WINDOW_HEIGHT, WINDOW_WIDTH, start_y, start_x); 
	box(win, 0, 0); // 加边框  
	wrefresh(win); 
	
	int progress = 0; 
	int max_progress = PROGRESS_BAR_WIDTH; 
	
	while (progress <= max_progress) { 
		werase(win); // 清除窗⼝内容  
		
		// 计算已完成的进度和剩余的进度  
		int completed = progress; 
		int remaining = max_progress - progress; 
		
		// 显⽰进度条  
		int bar_x = BORDER_PADDING + 1; // 进度条在窗⼝中的x坐标  
		int bar_y = 1; // 进度条在窗⼝中的y坐标（居中）  
		
		// 已完成部分  
		attron(COLOR_PAIR(1)); 
		for (int i = 0; i < completed; i++) { 
			mvwprintw(win, bar_y, bar_x + i, "#"); 
		} 
		attroff(COLOR_PAIR(1)); 
		
		// 剩余部分（⽤背景⾊填充）  
		attron(A_BOLD | COLOR_PAIR(2)); // 加粗并设置背景⾊为红⾊（仅⽤于演⽰）  
		for (int i = completed; i < max_progress; i++) { 
			mvwprintw(win, bar_y, bar_x + i, " "); 
		} 
		attroff(A_BOLD | COLOR_PAIR(2)); 
		
		// 显⽰百分⽐  
		char percent_str[10]; 
		snprintf(percent_str, sizeof(percent_str), "%d%%", (progress * 100) / max_progress); 
		int percent_x = (WINDOW_WIDTH - strlen(percent_str)) / 2; // 居中显⽰  
		mvwprintw(win, WINDOW_HEIGHT - 1, percent_x, percent_str); 
		wrefresh(win); // 刷新窗⼝以显⽰更新  
		
		// 增加进度  
		progress += PROGRESS_INCREMENT; 
		
		// 延迟⼀段时间  
		usleep(DELAY); 
	} 
	
	// 清理并退出ncurses模式  
	delwin(win); 
	endwin(); 
	return 0; 
}
